package com.fxu.jushuitan.dto.order;

import lombok.*;

import java.math.BigDecimal;
import java.util.List;

/**
 * 订单上传(推荐)请求
 * @author fangxu
 * @since 2022-04-13 15:49
 * @version 1.0.0
 **/
@Data
@Builder
public class OrderUploadReq {

    /**
     * 必填
     * 店铺编号
     */
    @NonNull
    private Integer shopId;

    /**
     * 必填
     * 线上订单号, 长度 <= 50
     */
    @NonNull
    private String soId;

    /**
     * 必填
     * 订单日期
     */
    @NonNull
    private String orderDate;

    /**
     * 必填
     * 订单： 等待买家付款=WAIT_BUYER_PAY，
     * 等待卖家发货=WAIT_SELLER_SEND_GOODS,
     * 等待买家确认收货=WAIT_BUYER_CONFIRM_GOODS,
     * 交易成功=TRADE_FINISHED,
     * 付款后交易关闭=TRADE_CLOSED,
     * 付款前交易关闭=TRADE_CLOSED_BY_TAOBAO；
     * 发货前可更新
     */
    @NonNull
    private String shopStatus;

    /**
     * 必填
     * 买家帐号 长度 <= 50
     */
    @NonNull
    private String shopBuyerId;

    /**
     * 必填
     * 收货省份 长度 <= 50；发货前可更新
     */
    @NonNull
    private String receiverState;

    /**
     * 必填
     * 收货市 长度<=50；发货前可更新
     */
    @NonNull
    private String receiverCity;

    /**
     * 必填
     * 收货区/街道 长度<=50；发货前可更新
     */
    @NonNull
    private String receiverDistrict;

    /**
     * 必填
     * 收货地址 长度<=200；发货前可更新
     */
    @NonNull
    private String receiverAddress;

    /**
     * 必填
     * 收件人 长度<=50；发货前可更新
     */
    @NonNull
    private String receiverName;

    /**
     * 必填
     * 联系电话 长度<=50；发货前可更新
     */
    @NonNull
    private String receiverPhone;

    /**
     * 非必填
     * 手机 长度<=50；发货前可更新
     */
    private String receiverMobile;

    /**
     * 必填
     * 应付金额，保留两位小数，单位元）
     */
    @NonNull
    private BigDecimal payAmount;

    /**
     * 必填
     * 运费
     */
    @NonNull
    private BigDecimal freight;

    /**
     * 非必填
     * 买家留言 长度<=400；可更新
     */
    private String buyerMessage;

    /**
     * 非必填
     * 卖家备注 长度<=150；可更新
     */
    private String remark;

    /**
     * 非必填
     * 是否货到付款
     */
    private Boolean isCod;

    /**
     * 必填
     * 订单修改日期
     */
    private String shopModified;

    /**
     * 非必填
     * 快递单号
     */
    private String lId;

    /**
     * 非必填
     * 快递公司名称
     */
    private String logisticsCompany;

    /**
     * 非必填
     * 订单异常描述
     */
    private String questionDesc;

    /**
     * 非必填
     * 卖家标签（旗帜），可选1:red, 2:yellow, 3:green, 4:blue, 5:purple
     */
    private Integer sellerFlag;

    /**
     * 非必填
     * 发货日期
     */
    private String sendDate;

    /**
     * 非必填
     * 订单多标签 长度<=200 以逗号分隔，单个标签不能超过十个字符
     */
    private String labels;

    /**
     * 非必填
     * 快递公司编码
     */
    private String lcId;

    /**
     * 非必填
     * 收货国家 长度<=50
     */
    private String receiverCountry;

    /**
     * 非必填
     * 邮政编码
     */
    private String receiverZip;

    /**
     * 非必填
     * 货币代码，跨境自有平台可使用
     */
    private String currency;

    /**
     * 非必填
     * 发票类型：
     * 个人电子普通;
     * 单位电子普通;
     * 个人纸质普通;
     * 单位纸质普通;
     * 个人电子增值税;
     * 单位电子增值税;
     * 个人纸质增值税;
     * 单位纸质增值税
     */
    private String invoiceType;

    /**
     * 非必填
     * 发票抬头
     */
    private String invoiceTitle;

    /**
     * 非必填
     * 发票税号
     */
    private String buyerTaxNo;

    /**
     * 非必填
     * 线下备注
     */
    private String node;

    /**
     * 非必填
     * 收货街道
     */
    private String receiverTown;

    /**
     * 专票信息
     */
    private Invoice invoice;

    /**
     * 身份证信息；非必填节点
     */
    private Card card;

    /**
     * 商品明细
     */
    @NonNull
    private List<Item> items;

    /**
     * shop_status=WAIT_BUYER_PAY 的时候可不给
     */
    private Pay pay;

    @Data
    @Builder
    public static class Item {

        /**
         * ERP内商品编码 长度 <=40 PS: 设置预售标识订单，修改商品编码=商品编码+预售（或==）+预计交货日期（可选）
         * 比如: "A321232" 修改为 "A321232预售2015-12-12" 或者 "A321232" 修改为 "A321232==2015-12-12"
         * 当商品被购买后ERP将自动识别为预售订单并更正商品编码为正确商品编码
         */
        @NonNull
        private String skuId;

        /**
         * 店铺商品编码 长度<=128
         */
        @NonNull
        private String shopSkuId;

        /**
         * 店铺商品款式编码
         */
        private String shopIId;

        /**
         * ERP内款号/货号 长度<=40
         */
        private String iId;

        /**
         * 图片地址 长度<=300
         */
        private String pic;

        /**
         * 商品属性；长度<=100
         */
        private String propertiesValue;

        /**
         * 成交总额，保留两位小数，单位（元）；备注：可能存在人工改价
         */
        @NonNull
        private BigDecimal amount;

        /**
         * 单价，单位（元）（（最大传4位小数））
         */
        private BigDecimal price;

        /**
         * 原价，保留两位小数，单位（元）
         */
        @NonNull
        private BigDecimal basePrice;

        /**
         * 数量
         */
        @NonNull
        private Integer qty;

        /**
         * 商品名称 长度<=100
         */
        @NonNull
        private String name;

        /**
         * PS：值存在，会自动将订单转异常,success 状态的，发货将不发该商品，不支持单商品发部分;
         * 退款状态:可选 退款中=waiting; 退款成功=success,closed=退款关闭:发货前可更新
         */
        private String refundStatus;

        /**
         * 商家系统订单商品明细主键,为了拆单合单时溯源，最长不超过 50,保持唯一
         */
        @NonNull
        private String outerOiId;

        /**
         * 订单明细备注
         */
        private String remark;

        /**
         * 虚拟仓编码
         */
        private BigDecimal buId;
    }

    @Data
    @Builder
    public static class Pay {

        /**
         * 外部支付单号，最大50
         */
        @NonNull
        private String outerPayId;

        /**
         * 支付日期
         */
        @NonNull
        private String payDate;

        /**
         * 支付方式，最大20
         */
        @NonNull
        private String payment;

        /**
         * 卖家支付账号，最大 50
         */
        @NonNull
        private String sellerAccount;

        /**
         * 买家支付账号，最大 200
         */
        @NonNull
        private String buyerAccount;

        /**
         * 支付总额
         */
        @NonNull
        private BigDecimal amount;
    }

    @Data
    @Builder
    public static class Invoice {

        /**
         * 专票地址
         */
        private String address;

        /**
         * 专票银行
         */
        private String bank;

        /**
         * 专票电话
         */
        private String phone;

        /**
         * 专票账户
         */
        private String account;

        /**
         * 专票邮箱
         */
        private String email;

        /**
         * 专票人姓名
         */
        private String userName;

        /**
         * 专票人电话
         */
        private String userPhone;

        /**
         * 专票人地址
         */
        private String userAddress;

    }

    @Data
    @Builder
    public static class Card {

        private String name;

        private String cardId;
    }
}